#include "Ruleta.h"
#include "Defs.h"

#include <fcntl.h>
#include <string.h>

#include <stdio.h>
#include <stdlib.h>

Ruleta::Ruleta(){

	int fd1; //archivos temporales para las shared memory
	int fd2; //archivos temporales para los semaforos

	char* clave=new char[50];	//Variable aux path de los archivos temporales
	for (int i = 0; i <= 36; i++) {

		//Genero las shared memory 0.36
		strcpy(clave,FILE_CELDA_X);
 		strcat(clave,intTostring(i).c_str());
		strcat(clave,".txt\0");

		fd1 = open(clave, O_RDWR | O_CREAT, 0777);
		if (fd1 == -1)
			cout<<"Error al crear archivos temporales para las claves de shared memory, " << clave <<endl;

		SharedMemory<int> * celda = new SharedMemory<int>(clave);
		celda->escribir(0);
		v.push_back(celda);
		close(fd1);

		//Genero los semaforos 0.36
		strcpy(clave,FILE_SEMAFORO_X);
 		strcat(clave,intTostring(i).c_str());
		strcat(clave,".txt\0");

		fd2 = open(clave, O_RDWR | O_CREAT, 0777);
		if (fd2 == -1)
			cout<<"Error al crear archivos temporales para las claves de semaforos, " << clave <<endl;

		Semaforo * semaforo = new Semaforo(clave,1);
		s.push_back(semaforo);
		close(fd2);	
	}
	delete clave;
	
}

Ruleta::~ Ruleta(){

	char* clave=new char[50];	//Variable aux path de los archivos temporales
	for (int i = 0; i <= 36; i++) {
		delete v[i];
		delete s[i];

		//Elimino los archivos temporales
		strcpy(clave,FILE_CELDA_X);
 		strcat(clave,intTostring(i).c_str());
		strcat(clave,".txt\0");
		remove(clave);

		strcpy(clave,FILE_SEMAFORO_X);
 		strcat(clave,intTostring(i).c_str());
		strcat(clave,".txt\0");
		remove(clave);		
	}
	v.clear();
	s.clear();
	delete clave;
}

int Ruleta::RND(){
	srand(time(NULL) + getpid());
	int resultado=rand()%37;
	return resultado;
}

//Bloqueo todos los numeros de la mesa
void Ruleta::noVaMas(){
	for(int numero=0; numero<37;numero++){
		((Semaforo *)s[numero])->p();
	}
}

//Desbloqueo todos los numeros de la mesa
void Ruleta::haganApuestas(){
	for(int numero=0; numero<37;numero++){
		((Semaforo *)s[numero])->v();
	}
}

int Ruleta::girar(){
	int total=0;
	int suma = 0;
	int resta;
	
	int ganador=RND();
	
	cout << "Numero ganador = " << ganador << endl;
	
	for(int numero=0; numero<37;numero++)
	{
		if( numero != ganador ){
			suma+=	((SharedMemory<int> *)v[numero])->leer();
		}
	}

	resta=36*((SharedMemory<int> *)v[ganador])->leer();	//fichas que habia en el ganador
	
	total = suma-resta;
	
	cout <<"Ganancia de la mesa = " << total << endl;
	
	return total;
}

void Ruleta::apuesta(int numero, int fichas){
	((Semaforo *)s[numero])->p();		//semaforo posicion numero
	
	int cantfichas=	((SharedMemory<int> *)v[numero])->leer();	//fichas que habia

	((SharedMemory<int> *)v[numero])->escribir(cantfichas+fichas);	//fichas que se apostaron

	((Semaforo *)s[numero])->v();
}

//Visualiza en ese instante la mesa de juego
void Ruleta::verMesaSinBloqueo(){
	cout << "------------ Mesa de Apuestas ------------" << endl;
	for (int i = 0; i < 37; i++) {
		int numero=((SharedMemory<int> *)v[i])->leer();	
		
		if(numero!=0){
			cout<<"Numero: "<<i<<", fichas = "<<numero<<endl;
		}
	}		
	cout << "------------------------------------------" << endl;	
}

//Visualiza en ese instante la mesa de juego
void Ruleta::verMesa(){
	for (int i = 0; i < 37; i++) {
		((Semaforo *)s[i])->p();
	}
	
	cout << "------------ Mesa de Apuestas ------------" << endl;
	for (int i = 0; i < 37; i++) {
		int numero=((SharedMemory<int> *)v[i])->leer();	
		
		if(numero!=0){
			cout<<"Numero: "<<i<<", fichas = "<<numero<<endl;
		}
	}		
	cout << "------------------------------------------" << endl;	
	
	for (int i = 0; i < 37; i++) {
		((Semaforo *)s[i])->v();
	}
}



//Pone toda la ruleta en 0 nuevamente
void Ruleta::reiniciar(){	
	for (int numero = 0; numero < 37; numero++) {
		((SharedMemory<int> *)v[numero])->escribir(0);	
	}
}


string Ruleta::intTostring(int i){	
	string str;
	stringstream is;
	is << i;
	is >> str;
	return str;
}

